home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / c / dicepj20.lha / diceproject / sources / Screen.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-05  |  39.5 KB  |  1,355 lines

  1. /*
  2.  *  Source machine generated by GadToolsBox V2.0
  3.  *  which is (c) Copyright 1991-1993 Jaba Development
  4.  *
  5.  *  GUI Designed by : Jan van den Baard
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <intuition/intuition.h>
  10. #include <intuition/classes.h>
  11. #include <intuition/classusr.h>
  12. #include <intuition/imageclass.h>
  13. #include <intuition/gadgetclass.h>
  14. #include <intuition/intuitionbase.h>
  15. #include <libraries/gadtools.h>
  16. #include <libraries/iffparse.h>
  17. #include <libraries/asl.h>
  18. #include <graphics/displayinfo.h>
  19. #include <graphics/gfxbase.h>
  20. #include <clib/exec_protos.h>
  21. #include <clib/intuition_protos.h>
  22. #include <clib/asl_protos.h>
  23. #include <clib/iffparse_protos.h>
  24. #include <clib/gadtools_protos.h>
  25. #include <clib/graphics_protos.h>
  26. #include <clib/utility_protos.h>
  27. #include <string.h>
  28. #include <stdlib.h>
  29. #include <ctype.h>
  30.  
  31. #include <resources.h>
  32.  
  33. #define CATCOMP_NUMBERS
  34.  
  35. #include "project.catalog.h"
  36.  
  37. #include "project.h"
  38. #include "Special.h"
  39.  
  40. struct Window          *ScreenPrefsWnd = NULL;
  41. struct Window          *PalettePrefsWnd = NULL;
  42. struct Gadget          *ScreenPrefsGList = NULL;
  43. struct Gadget          *PalettePrefsGList = NULL;
  44. struct IntuiMessage    ScreenPrefsMsg;
  45. struct IntuiMessage    PalettePrefsMsg;
  46. UWORD               ScreenPrefsZoom[4];
  47. UWORD               PalettePrefsZoom[4];
  48. struct Gadget          *ScreenPrefsGadgets[17];
  49. struct Gadget          *PalettePrefsGadgets[8];
  50. UWORD               ScreenPrefsLeft = 87;
  51. UWORD               ScreenPrefsTop = 289;
  52. UWORD               ScreenPrefsWidth = 409;
  53. UWORD               ScreenPrefsHeight = 203;
  54. UWORD               PalettePrefsLeft = 328;
  55. UWORD               PalettePrefsTop = 122;
  56. UWORD               PalettePrefsWidth = 455;
  57. UWORD               PalettePrefsHeight = 165;
  58. UBYTE              *ScreenPrefsWdt = (UBYTE *)"Project Handler : Screen Preferences 2.0";
  59. UBYTE              *PalettePrefsWdt = (UBYTE *)"Project Handler : Palette Control 2.0";
  60.  
  61. UBYTE *Type0Labels[] = {
  62.     (UBYTE *)"Public",
  63.     (UBYTE *)"Workbench",
  64.     NULL };
  65.  
  66. UBYTE *Overscan0Labels[] = {
  67.     (UBYTE *)"Nominal",
  68.     (UBYTE *)"Maximum",
  69.     (UBYTE *)"Video",
  70.     (UBYTE *)"Standard",
  71.     (UBYTE *)"Text",
  72.     NULL };
  73.  
  74. extern struct MinList Pens1List;
  75.  
  76. struct Node Pens1Nodes[] = {
  77.     &Pens1Nodes[1], (struct Node *)&Pens1List.mlh_Head,0,0,"Block Pen",
  78.     &Pens1Nodes[2], &Pens1Nodes[0],0,0,"Detail Pen",
  79.     &Pens1Nodes[3], &Pens1Nodes[1], 0, 0, "Text Pen",
  80.     &Pens1Nodes[4], &Pens1Nodes[2], 0, 0, "3D Bright Edge",
  81.     &Pens1Nodes[5], &Pens1Nodes[3], 0, 0, "3D Dark Edge",
  82.     &Pens1Nodes[6], &Pens1Nodes[4], 0, 0, "Active/Selected Fill",
  83.     &Pens1Nodes[7], &Pens1Nodes[5], 0, 0, "Active/Selected Text",
  84.     &Pens1Nodes[8], &Pens1Nodes[6], 0, 0, "Background Pen",
  85.     &Pens1Nodes[9], &Pens1Nodes[7], 0, 0, "Highlight Text",
  86.     &Pens1Nodes[10], &Pens1Nodes[8], 0, 0, "Text Menu",
  87.     &Pens1Nodes[11], &Pens1Nodes[9], 0, 0, "Background Menu",
  88.     ( struct Node * )&Pens1List.mlh_Tail, &Pens1Nodes[10], 0, 0, "Trim under Screen Bar" };
  89.  
  90. struct MinList Pens1List = {
  91.     ( struct MinNode * )&Pens1Nodes[0], ( struct MinNode * )NULL, ( struct MinNode * )&Pens1Nodes[8] };
  92.  
  93. UWORD ScreenPrefsGTypes[] = {
  94.     LISTVIEW_KIND,
  95.     BUTTON_KIND,
  96.     BUTTON_KIND,
  97.     BUTTON_KIND,
  98.     BUTTON_KIND,
  99.     STRING_KIND,
  100.     CYCLE_KIND,
  101.     SCROLLER_KIND,
  102.     INTEGER_KIND,
  103.     SCROLLER_KIND,
  104.     INTEGER_KIND,
  105.     CYCLE_KIND,
  106.     CHECKBOX_KIND,
  107.     CHECKBOX_KIND,
  108.     BUTTON_KIND,
  109.     CHECKBOX_KIND
  110. };
  111.  
  112. UWORD PalettePrefsGTypes[] = {
  113.     LISTVIEW_KIND,
  114.     PALETTE_KIND,
  115.     PALETTE_KIND,
  116.     SLIDER_KIND,
  117.     SLIDER_KIND,
  118.     SLIDER_KIND
  119.     BUTTON_KIND,
  120.     BUTTON_KIND,
  121. };
  122.  
  123. struct NewGadget ScreenPrefsNGad[] = {
  124.     9, 48, 168, 130, (UBYTE *)"Display _ID", NULL, GD_DispID, PLACETEXT_ABOVE, NULL, (APTR)DispIDClicked,
  125.     26, 182, 96, 16, NULL, NULL, GD_Use, PLACETEXT_IN, NULL, (APTR)UseClicked,
  126.     142, 182, 96, 16, NULL, NULL, GD_Cancel, PLACETEXT_IN, NULL, (APTR)Cancel0Clicked,
  127.     264, 182, 111, 16, (UBYTE *)"_Restore Default", NULL, GD_Workbench, PLACETEXT_IN, NULL, (APTR)WorkbenchClicked,
  128.     288, 114, 111, 16, (UBYTE *)"_Palette", NULL, GD_Palette, PLACETEXT_IN, NULL, (APTR)Palette0Clicked,
  129.     195, 9, 204, 17, NULL, NULL, GD_PubName, 0, NULL, (APTR)PubNameClicked,
  130.     90, 9, 100, 17, (UBYTE *)"Screen _Type", NULL, GD_Type, PLACETEXT_LEFT, NULL, (APTR)TypeClicked,
  131.     297, 70, 102, 17, NULL, NULL, GD_ScrWidth, 0, NULL, (APTR)ScrWidth0Clicked,
  132.     248, 70, 44, 17, (UBYTE *)"_Width ", NULL, GD_Width, PLACETEXT_LEFT, NULL, (APTR)WidthClicked,
  133.     297, 92, 102, 17, NULL, NULL, GD_ScrHeight, 0, NULL, (APTR)ScrHeight0Clicked,
  134.     248, 92, 44, 17, (UBYTE *)"_Height", NULL, GD_Height, PLACETEXT_LEFT, NULL, (APTR)HeightClicked,
  135.     185, 48, 214, 17, (UBYTE *)"_Overscan", NULL, GD_Overscan, PLACETEXT_ABOVE, NULL, (APTR)OverscanClicked,
  136.     193, 114, 26, 11, (UBYTE *)"_Default", NULL, GD_DefPalette, PLACETEXT_RIGHT, NULL, (APTR)DefPaletteClicked,
  137.     193, 156, 26, 11, (UBYTE *)"Autos_croll", NULL, GD_Autoscroll, PLACETEXT_RIGHT, NULL, (APTR)AutoscrollClicked,
  138.     288, 135, 111, 16, (UBYTE *)"Select _Font", NULL, GD_Font, PLACETEXT_IN, NULL, (APTR)FontClicked,
  139.     193, 135, 26, 11, (UBYTE *)"S_ysFonts", NULL, GD_SysFonts, PLACETEXT_RIGHT, NULL, (APTR)SysFontsClicked
  140. };
  141.  
  142. struct NewGadget PalettePrefsNGad[] = {
  143.     9, 23, 213, 100, (UBYTE *)"_Pen Attributes", NULL, GD_Pens, PLACETEXT_ABOVE, NULL, (APTR)PensClicked,
  144.     9, 118, 216, 20, NULL, NULL, GD_PenColors, 0, NULL, (APTR)PenColorsClicked,
  145.     232, 23, 216, 20, (UBYTE *)"Color _Table", NULL, GD_Table, PLACETEXT_ABOVE, NULL, (APTR)TableClicked,
  146.     280, 68, 136, 17, (UBYTE *)"_Red", NULL, GD_Red, PLACETEXT_ABOVE, NULL, (APTR)Red0Clicked,
  147.     280, 104, 136, 17, (UBYTE *)"_Green", NULL, GD_Green, PLACETEXT_ABOVE, NULL, (APTR)Green0Clicked,
  148.     280, 141, 136, 17, (UBYTE *)"_Blue", NULL, GD_Blue, PLACETEXT_ABOVE, NULL, (APTR)Blue0Clicked
  149.     26, 145, 96, 16, NULL, NULL, 11, PLACETEXT_IN, NULL, (APTR)Use1Clicked,
  150.     142, 145, 96, 16, NULL, NULL, 10, PLACETEXT_IN, NULL, (APTR)Cancel1Clicked,
  151. };
  152.  
  153. ULONG ScreenPrefsGTags[] = {
  154.     (GTLV_ShowSelected), NULL, (GT_Underscore), '_', (TAG_DONE),
  155.     (GT_Underscore), '_', (TAG_DONE),
  156.     (GT_Underscore), '_', (TAG_DONE),
  157.     (GT_Underscore), '_', (TAG_DONE),
  158.     (GT_Underscore), '_', (TAG_DONE),
  159.     (GTST_MaxChars), 256, (TAG_DONE),
  160.     (GTCY_Labels), (ULONG)&Type0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
  161.     (GTSC_Arrows), 8, (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (TAG_DONE),
  162.     (GTIN_Number), 0, (GTIN_MaxChars), 10, (GT_Underscore), '_', (TAG_DONE),
  163.     (GTSC_Arrows), 8, (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (TAG_DONE),
  164.     (GTIN_Number), 0, (GTIN_MaxChars), 10, (GT_Underscore), '_', (TAG_DONE),
  165.     (GTCY_Labels), (ULONG)&Overscan0Labels[ 0 ], (GT_Underscore), '_', (TAG_DONE),
  166.     (GTCB_Checked), TRUE, (GT_Underscore), '_', (TAG_DONE),
  167.     (GTCB_Checked), TRUE, (GT_Underscore), '_', (TAG_DONE),
  168.     (GT_Underscore), '_', (TAG_DONE),
  169.     (GTCB_Checked), TRUE, (GT_Underscore), '_', (TAG_DONE)
  170. };
  171.  
  172. ULONG PalettePrefsGTags[] = {
  173.     (GTLV_Labels), (ULONG)&Pens1List, (GTLV_Selected) , 0 , (GTLV_ShowSelected) , 0 , (GT_Underscore), '_', (TAG_DONE),
  174.     (GTPA_Depth), 2, (GTPA_Color), 1, (GTPA_ColorOffset), 0, (GTPA_IndicatorWidth) , 16 , (TAG_DONE),
  175.     (GTPA_Depth), 2, (GTPA_Color), 0, (GTPA_ColorOffset), 0, (GTPA_IndicatorWidth) , 16 , (GT_Underscore), '_', (TAG_DONE),
  176.     (GTSL_Max), 255, (GTSL_MaxLevelLen), 10, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
  177.     (GTSL_Max), 255, (GTSL_MaxLevelLen), 10, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
  178.     (GTSL_Max), 255, (GTSL_MaxLevelLen), 10, (GTSL_LevelFormat), (ULONG)"%3ld", (GTSL_LevelPlace), (PLACETEXT_RIGHT), (PGA_Freedom), LORIENT_HORIZ, (GA_Immediate), TRUE, (GA_RelVerify), TRUE, (GT_Underscore), '_', (TAG_DONE),
  179.     (GT_Underscore), '_', (TAG_DONE),
  180.     (GT_Underscore), '_', (TAG_DONE),
  181. };
  182.  
  183.  
  184. extern void ComputeFont( UWORD , UWORD );
  185.  
  186. extern UWORD ComputeX( UWORD );
  187. extern UWORD ComputeY( UWORD );
  188.  
  189. int HandleScreenPrefsIDCMP( void )
  190. {
  191.     struct IntuiMessage    *m;
  192.     int            (*func)(void);
  193.     BOOL            running = TRUE;
  194.  
  195.     while( ScreenPrefsWnd != NULL && (m = GT_GetIMsg( ScreenPrefsWnd->UserPort )) ) {
  196.  
  197.         CopyMem(( char * )m, ( char * )&ScreenPrefsMsg, (long)sizeof( struct IntuiMessage ));
  198.  
  199.         GT_ReplyIMsg( m );
  200.  
  201.         switch ( ScreenPrefsMsg.Class ) {
  202.  
  203.             case    IDCMP_REFRESHWINDOW:
  204.                 GT_BeginRefresh( ScreenPrefsWnd );
  205.                 GT_EndRefresh( ScreenPrefsWnd, TRUE );
  206.                 break;
  207.  
  208.             case    IDCMP_VANILLAKEY:
  209.                 running = ScreenPrefsVanillaKey();
  210.                 break;
  211.  
  212.             case    IDCMP_RAWKEY:
  213.                 if ( ScreenPrefsMsg.Code == 95 )
  214.                     ChargeAide( "WIN_Screen" );
  215.                 break;
  216.  
  217.             case    IDCMP_MOUSEMOVE:
  218.             case    IDCMP_GADGETUP:
  219.             case    IDCMP_GADGETDOWN:
  220.                 func = ( void * )(( struct Gadget * )ScreenPrefsMsg.IAddress )->UserData;
  221.                 running = func();
  222.                 break;
  223.  
  224.             case    IDCMP_MENUPICK:
  225.                 break;
  226.         }
  227.     }
  228.     return( running );
  229. }
  230.  
  231. int OpenScreenPrefsWindow( void )
  232. {
  233.     struct NewGadget    ng;
  234.     struct Gadget    *g;
  235.     UWORD        lc, tc;
  236.     UWORD        wleft = ScreenPrefsLeft, wtop = ScreenPrefsTop, ww, wh;
  237.  
  238.     ComputeFont( ScreenPrefsWidth, ScreenPrefsHeight );
  239.  
  240.     ww = ComputeX( ScreenPrefsWidth );
  241.     wh = ComputeY( ScreenPrefsHeight );
  242.  
  243.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  244.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  245.  
  246.     if ( ! ( g = CreateContext( &ScreenPrefsGList )))
  247.         return( 1L );
  248.  
  249.     for( lc = 0, tc = 0; lc < ScreenPrefs_CNT; lc++ ) {
  250.  
  251.         CopyMem((char * )&ScreenPrefsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  252.  
  253.         ng.ng_VisualInfo = VisualInfo;
  254.         ng.ng_TextAttr     = Font;
  255.         ng.ng_LeftEdge     = OffX + ComputeX( ng.ng_LeftEdge );
  256.         ng.ng_TopEdge     = OffY + ComputeY( ng.ng_TopEdge );
  257.         ng.ng_Width     = ComputeX( ng.ng_Width );
  258.         ng.ng_Height     = ComputeY( ng.ng_Height);
  259.  
  260.         ScreenPrefsGadgets[ lc ] = g = CreateGadgetA((ULONG)ScreenPrefsGTypes[ lc ], g, &ng, ( struct TagItem * )&ScreenPrefsGTags[ tc ] );
  261.  
  262.         while( ScreenPrefsGTags[ tc ] ) tc += 2;
  263.         tc++;
  264.  
  265.         if ( NOT g )
  266.             return( 2L );
  267.     }
  268.  
  269.     ScreenPrefsZoom[0] = ScreenPrefsLeft;
  270.     ScreenPrefsZoom[1] = ScreenPrefsTop;
  271.     if ( ScreenPrefsWdt )
  272.         ScreenPrefsZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)ScreenPrefsWdt, strlen((char *)ScreenPrefsWdt )) + 80;
  273.     else
  274.         ScreenPrefsZoom[2]  = 80L;
  275.         ScreenPrefsZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
  276.  
  277.     if ( ! ( ScreenPrefsWnd = OpenWindowTags( NULL,
  278.                 WA_Left,    wleft,
  279.                 WA_Top,     wtop,
  280.                 WA_Width,    ww + OffX + Scr->WBorRight,
  281.                 WA_Height,    wh + OffY + Scr->WBorBottom,
  282.                 WA_IDCMP,    LISTVIEWIDCMP|BUTTONIDCMP|STRINGIDCMP|CYCLEIDCMP|SCROLLERIDCMP|ARROWIDCMP|INTEGERIDCMP|CHECKBOXIDCMP|
  283.                         IDCMP_MENUPICK|IDCMP_MOUSEMOVE|IDCMP_VANILLAKEY|IDCMP_RAWKEY|IDCMP_REFRESHWINDOW,
  284.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
  285.                 WA_Gadgets,    ScreenPrefsGList,
  286.                 WA_Title,    ScreenPrefsWdt,
  287.                 WA_PubScreen,    Scr,
  288.                 WA_Activate,    TRUE,
  289.                 WA_Zoom,    ScreenPrefsZoom,
  290.                 WA_AutoAdjust,    TRUE,
  291.                 TAG_DONE )))
  292.     return( 4L );
  293.  
  294.     GT_RefreshWindow( ScreenPrefsWnd, NULL );
  295.  
  296.     if ( ROMVersion >= 39 )
  297.         LendMenus( ScreenPrefsWnd , ProjectWnd );
  298.  
  299.     return( 0L );
  300. }
  301.  
  302. void CloseScreenPrefsWindow( void )
  303. {
  304.     if ( ScreenPrefsWnd        ) {
  305.         CloseWindow( ScreenPrefsWnd );
  306.         ScreenPrefsWnd = NULL;
  307.     }
  308.  
  309.     if ( ScreenPrefsGList      ) {
  310.         FreeGadgets( ScreenPrefsGList );
  311.         ScreenPrefsGList = NULL;
  312.     }
  313. }
  314.  
  315. int HandlePalettePrefsIDCMP( void )
  316. {
  317.     struct IntuiMessage    *m;
  318.     int            (*func)(void);
  319.     BOOL            running = TRUE;
  320.  
  321.     while( (PalettePrefsWnd != NULL) && (m = GT_GetIMsg( PalettePrefsWnd->UserPort )) ) {
  322.  
  323.         CopyMem(( char * )m, ( char * )&PalettePrefsMsg, (long)sizeof( struct IntuiMessage ));
  324.  
  325.         GT_ReplyIMsg( m );
  326.  
  327.         switch ( PalettePrefsMsg.Class ) {
  328.  
  329.             case    IDCMP_REFRESHWINDOW:
  330.                 GT_BeginRefresh( PalettePrefsWnd );
  331.                 GT_EndRefresh( PalettePrefsWnd, TRUE );
  332.                 break;
  333.  
  334.             case    IDCMP_VANILLAKEY:
  335.                 running = PalettePrefsVanillaKey();
  336.                 break;
  337.  
  338.             case    IDCMP_RAWKEY:
  339.                 if ( PalettePrefsMsg.Code == 95 )
  340.                     ChargeAide( "WIN_Palette" );
  341.                 break;
  342.  
  343.             case    IDCMP_MOUSEMOVE:
  344.             case    IDCMP_GADGETUP:
  345.             case    IDCMP_GADGETDOWN:
  346.                 func = ( void * )(( struct Gadget * )PalettePrefsMsg.IAddress )->UserData;
  347.                 running = func();
  348.                 break;
  349.         }
  350.     }
  351.     return( running );
  352. }
  353.  
  354. int OpenPalettePrefsWindow( void )
  355. {
  356.     struct NewGadget    ng;
  357.     struct Gadget    *g;
  358.     UWORD        lc, tc;
  359.     UWORD        wleft = PalettePrefsLeft, wtop = PalettePrefsTop, ww, wh;
  360.  
  361.     ComputeFont( PalettePrefsWidth, PalettePrefsHeight );
  362.  
  363.     ww = ComputeX( PalettePrefsWidth );
  364.     wh = ComputeY( PalettePrefsHeight );
  365.  
  366.     if (( wleft + ww + OffX + Scr->WBorRight ) > Scr->Width ) wleft = Scr->Width - ww;
  367.     if (( wtop + wh + OffY + Scr->WBorBottom ) > Scr->Height ) wtop = Scr->Height - wh;
  368.  
  369.     if ( ! ( g = CreateContext( &PalettePrefsGList )))
  370.         return( 1L );
  371.  
  372.     for( lc = 0, tc = 0; lc < PalettePrefs_CNT; lc++ ) {
  373.  
  374.         CopyMem((char * )&PalettePrefsNGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  375.  
  376.         ng.ng_VisualInfo = VisualInfo;
  377.         ng.ng_TextAttr     = Font;
  378.         ng.ng_LeftEdge     = OffX + ComputeX( ng.ng_LeftEdge );
  379.         ng.ng_TopEdge     = OffY + ComputeY( ng.ng_TopEdge );
  380.         ng.ng_Width     = ComputeX( ng.ng_Width );
  381.         ng.ng_Height     = ComputeY( ng.ng_Height);
  382.  
  383.         PalettePrefsGadgets[ lc ] = g = CreateGadgetA((ULONG)PalettePrefsGTypes[ lc ], g, &ng, ( struct TagItem * )&PalettePrefsGTags[ tc ] );
  384.  
  385.         while( PalettePrefsGTags[ tc ] ) tc += 2;
  386.         tc++;
  387.  
  388.         if ( NOT g )
  389.             return( 2L );
  390.     }
  391.  
  392.     PalettePrefsZoom[0] = PalettePrefsLeft;
  393.     PalettePrefsZoom[1] = PalettePrefsTop;
  394.     if ( PalettePrefsWdt )
  395.         PalettePrefsZoom[2] = TextLength( &Scr->RastPort, (UBYTE *)PalettePrefsWdt, strlen((char *)PalettePrefsWdt )) + 80;
  396.     else
  397.         PalettePrefsZoom[2]  = 80L;
  398.         PalettePrefsZoom[3] = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
  399.  
  400.     if ( ! ( PalettePrefsWnd = OpenWindowTags( NULL,
  401.                 WA_Left,    wleft,
  402.                 WA_Top,     wtop,
  403.                 WA_Width,    ww + OffX + Scr->WBorRight,
  404.                 WA_Height,    wh + OffY + Scr->WBorBottom,
  405.                 WA_IDCMP,    LISTVIEWIDCMP|PALETTEIDCMP|SLIDERIDCMP|IDCMP_VANILLAKEY|IDCMP_REFRESHWINDOW|IDCMP_MOUSEMOVE|IDCMP_RAWKEY,
  406.                 WA_Flags,    WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_SMART_REFRESH,
  407.                 WA_Gadgets,    PalettePrefsGList,
  408.                 WA_Title,    PalettePrefsWdt,
  409.                 WA_PubScreen,    Scr,
  410.                 WA_Activate,    TRUE,
  411.                 WA_Zoom,    PalettePrefsZoom,
  412.                 TAG_DONE )))
  413.     return( 4L );
  414.  
  415.     GT_RefreshWindow( PalettePrefsWnd, NULL );
  416.  
  417.     if ( ROMVersion >= 39 )
  418.         LendMenus( PalettePrefsWnd , ProjectWnd );
  419.  
  420.     return( 0L );
  421. }
  422.  
  423. void ClosePalettePrefsWindow( void )
  424. {
  425.     if ( PalettePrefsWnd        ) {
  426.         CloseWindow( PalettePrefsWnd );
  427.         PalettePrefsWnd = NULL;
  428.     }
  429.  
  430.     if ( PalettePrefsGList      ) {
  431.         FreeGadgets( PalettePrefsGList );
  432.         PalettePrefsGList = NULL;
  433.     }
  434. }
  435.  
  436. struct List ScreenIDs;
  437. char *PublicName;
  438. UWORD Pens0[12],CurrentPen,OldPens0[12];        /* Ne pas changer les tailles comme ça, voir fct PaletteClicked */
  439. ULONG Colors0[4][3],OldColors0[4][3],CurrentColor;    /* Idem */
  440. struct TextAttr Font0;
  441. UBYTE AutoScroll,Overscan,ScreenType;
  442. long DisplayIDNum,DisplayID,Width,Height;
  443. Point Res;
  444. BOOL DefaultColors=TRUE,DefaultFont=TRUE;
  445.  
  446. void ActiveWB( BOOL act ) {
  447.     GT_SetGadgetAttrs( ScreenPrefsGadgets[0] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  448.     GT_SetGadgetAttrs( ScreenPrefsGadgets[4] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  449.     GT_SetGadgetAttrs( ScreenPrefsGadgets[5] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  450.     GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  451.     GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  452.     GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  453.     GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  454.     GT_SetGadgetAttrs( ScreenPrefsGadgets[11] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  455.     GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  456.     GT_SetGadgetAttrs( ScreenPrefsGadgets[13] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  457.     GT_SetGadgetAttrs( ScreenPrefsGadgets[14] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  458.     GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GA_Disabled , act , TAG_DONE );
  459. }
  460.  
  461. void UpdateDimension(void) {
  462.   struct DimensionInfo DI;
  463.   struct Rectangle *Rect;
  464.  
  465.     if ( GetDisplayInfoData( 0 , (UBYTE *)&DI , sizeof( struct DimensionInfo ) , DTAG_DIMS , DisplayID ) ) {
  466.     switch( Overscan ) {
  467.       case 0:
  468.         Rect = &DI.Nominal;
  469.         break;
  470.       case 1:
  471.         Rect = &DI.MaxOScan;
  472.         break;
  473.       case 2:
  474.         Rect = &DI.VideoOScan;
  475.         break;
  476.       case 3:
  477.         Rect = &DI.TxtOScan;
  478.         break;
  479.       case 4:
  480.         Rect = &DI.StdOScan;
  481.     }
  482.     Width = Res.x = Rect->MaxX+1;
  483.     Height = Res.y = Rect->MaxY+1;
  484.     }
  485.     if ( ScreenPrefsWnd ) {
  486.     GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GTIN_Number , Width , TAG_DONE );
  487.     GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GTIN_Number , Height , TAG_DONE );
  488.     GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GTSC_Top , 0 , GTSC_Total , 16384-Res.x , TAG_DONE );
  489.     GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GTSC_Top , 0 , GTSC_Total , 16384-Res.y , TAG_DONE );
  490.     }
  491. }
  492.  
  493.  
  494. int DispIDClicked( void )
  495. {
  496.   long n = 0;
  497.   struct ScreenNode *wn = ScreenIDs.lh_Head;
  498.  
  499.     while( wn->node.ln_Succ && n++<ScreenPrefsMsg.Code ) {
  500.     wn = wn->node.ln_Succ;
  501.     }
  502.     if ( wn->node.ln_Succ )
  503.     {
  504.     DisplayID = wn->ID;
  505.     DisplayIDNum = n;
  506.     }
  507.     UpdateDimension();
  508. }
  509.  
  510. void ColorsTOTag32( ULONG *data ) {
  511.   int i;
  512.  
  513.     *data++ = 4;
  514.     *data++ = 0;
  515.     for( i = 0;i<4;i++ ) {
  516.     *data++ = Colors0[i][0]<<24;
  517.     *data++ = Colors0[i][1]<<24;
  518.     *data++ = Colors0[i][2]<<24;
  519.     }
  520. }
  521.  
  522. void ColorsTOTag4( struct ColorSpec *cs ) {
  523.   int i;
  524.  
  525.     for( i = 0;i<4;i++ ) {
  526.     cs->ColorIndex = i;
  527.     cs->Red = (UWORD)Colors0[i][0]>>4;
  528.     cs->Green = (UWORD)Colors0[i][1]>>4;
  529.     cs->Blue = (UWORD)Colors0[i][2]>>4;
  530.     cs++;
  531.     }
  532.     cs->ColorIndex = -1;
  533. }
  534.  
  535. #define NUM_SCREEN_TAG 13
  536.  
  537. void BuildScreenTags( void ) {
  538.     ScreenTags = AllocateTagItems( NUM_SCREEN_TAG );
  539.     ScreenTags[0].ti_Tag = SA_PubName;
  540.     ScreenTags[0].ti_Data = strdup( PublicName );
  541.     ScreenTags[1].ti_Tag = SA_Overscan;
  542.     switch( Overscan ) {
  543.       case 0:
  544.     ScreenTags[1].ti_Data = 0;
  545.     break;
  546.       case 2:
  547.     ScreenTags[1].ti_Data = OSCAN_VIDEO;
  548.     break;
  549.       case 1:
  550.     ScreenTags[1].ti_Data = OSCAN_MAX;
  551.     break;
  552.       case 3:
  553.     ScreenTags[1].ti_Data = OSCAN_TEXT;
  554.     break;
  555.       case 4:
  556.     ScreenTags[1].ti_Data = OSCAN_STANDARD;
  557.     break;
  558.     }
  559.     ScreenTags[2].ti_Tag = SA_FullPalette;
  560.     ScreenTags[2].ti_Data = TRUE;
  561.     ScreenTags[3].ti_Tag = SA_Type;
  562.     if ( ScreenType )
  563.     {
  564.     ScreenTags[0].ti_Tag = TAG_IGNORE;
  565.     ScreenTags[3].ti_Data = WBENCHSCREEN;
  566.     }
  567.     else
  568.     ScreenTags[3].ti_Data = PUBLICSCREEN;
  569.     ScreenTags[4].ti_Tag = SA_AutoScroll;
  570.     ScreenTags[4].ti_Data = AutoScroll;
  571.     ScreenTags[5].ti_Tag = SA_DisplayID;
  572.     ScreenTags[5].ti_Data = DisplayID;
  573.     ScreenTags[6].ti_Tag = SA_Width;
  574.     if ( Width != Res.x )
  575.     ScreenTags[6].ti_Data = (long)Width;
  576.     else
  577.     ScreenTags[6].ti_Data = STDSCREENWIDTH;
  578.     ScreenTags[7].ti_Tag = SA_Height;
  579.     if ( Height != Res.y )
  580.     ScreenTags[7].ti_Data = (long)Height;
  581.     else
  582.     ScreenTags[7].ti_Data = STDSCREENHEIGHT;
  583.     ScreenTags[8].ti_Tag = SA_Pens;
  584.     ScreenTags[8].ti_Data = malloc(26);
  585.     *((UWORD *)ScreenTags[8].ti_Data) = ~0;
  586.     ScreenTags[9].ti_Tag = TAG_IGNORE;
  587.     ScreenTags[10].ti_Tag = TAG_IGNORE;
  588.     if ( !DefaultColors ) {
  589.     ScreenTags[9].ti_Tag = SA_Colors;
  590.     memcpy( (UWORD *)ScreenTags[8].ti_Data , Pens0 , 24 );
  591.     ((UWORD *)ScreenTags[8].ti_Data)[12] = ~0;
  592.     ScreenTags[9].ti_Data = malloc( 40 );
  593.     ColorsTOTag4( (struct ColorSpec *)ScreenTags[9].ti_Data );
  594.     ScreenTags[10].ti_Tag = SA_Colors32;
  595.     ScreenTags[10].ti_Data = malloc( 56 );
  596.     ColorsTOTag32( (ULONG *)ScreenTags[10].ti_Data );
  597.     }
  598.     if ( DefaultFont )
  599.     ScreenTags[11].ti_Tag = SA_SysFont;
  600.     else {
  601.     ScreenTags[11].ti_Tag = SA_Font;
  602.     ScreenTags[11].ti_Data = malloc( sizeof( struct TextAttr ) );
  603.     memcpy( (void *)ScreenTags[11].ti_Data , &Font0 , sizeof( struct TextAttr ) );
  604.     ((struct TextAttr *)ScreenTags[11].ti_Data)->ta_Name = strdup( Font0.ta_Name );
  605.     }
  606.     ScreenTags[12].ti_Tag = TAG_END;
  607. }
  608.  
  609. void DeleteScreenTags( void ) {
  610.   struct TagItem *ti;
  611.  
  612.     if ( ti = FindTagItem( SA_PubName , ScreenTags ) )
  613.     free( (void *)ti->ti_Data );
  614.     if ( ti = FindTagItem( SA_Colors , ScreenTags ) )
  615.     free( (void *)ti->ti_Data );
  616.     if ( ti = FindTagItem( SA_Colors32 , ScreenTags ) )
  617.     free( (void *)ti->ti_Data );
  618.     if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
  619.     free( (void *)ti->ti_Data );
  620.     if ( ti = FindTagItem( SA_Font , ScreenTags ) ) {
  621.     free( ((struct TextAttr *)ti->ti_Data)->ta_Name );
  622.     free( (void *)ti->ti_Data );
  623.     }
  624.     FreeTagItems( ScreenTags );
  625. }
  626.  
  627. void LoadScreenTags( struct IFFHandle *iff ) {
  628. struct StoredProperty *buf;
  629. struct TagItem *ti;
  630. char *fontname;
  631.  
  632.     PropChunk( iff , ID_SCRN , ID_TAGS );
  633.     PropChunk( iff , ID_SCRN , ID_PENS );
  634.     PropChunk( iff , ID_SCRN , ID_CLR2 );
  635.     PropChunk( iff , ID_SCRN , ID_CLR4 );
  636.     PropChunk( iff , ID_SCRN , ID_PUBN );
  637.     PropChunk( iff , ID_SCRN , ID_FONT );
  638.     StopOnExit( iff , ID_SCRN , ID_FORM );
  639.     ParseIFF( iff , IFFPARSE_SCAN );
  640.     if ( buf = FindProp( iff , ID_SCRN , ID_TAGS ) ) {
  641.     DeleteScreenTags( );
  642.     ScreenTags = AllocateTagItems( buf->sp_Size / sizeof( struct TagItem ) );
  643.     memcpy( ScreenTags , buf->sp_Data , buf->sp_Size );
  644.     if ( ti = FindTagItem( SA_PubName , ScreenTags ) )
  645.         if ( buf = FindProp( iff , ID_SCRN , ID_PUBN ) )
  646.         ti->ti_Data = strdup( buf->sp_Data );
  647.         else
  648.         ti->ti_Data = strdup( "DICE_Project_Handler" );
  649.     if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
  650.     {
  651.         if ( buf = FindProp( iff , ID_SCRN , ID_PENS ) )
  652.         {
  653.         ti->ti_Data = malloc( buf->sp_Size );
  654.         memcpy( (void *)ti->ti_Data , buf->sp_Data , buf->sp_Size );
  655.         }
  656.         else
  657.         {
  658.         ti->ti_Data = malloc( 2 );
  659.         *((UWORD *)ti->ti_Data) = ~0;
  660.         }
  661.     }
  662.     if ( ti = FindTagItem( SA_Colors32 , ScreenTags ) )
  663.     {
  664.         if ( buf = FindProp( iff , ID_SCRN , ID_CLR4 ) )
  665.         {
  666.         ti->ti_Data = malloc( buf->sp_Size );
  667.         memcpy( (void *)ti->ti_Data , buf->sp_Data , buf->sp_Size );
  668.         }
  669.         else
  670.         {
  671.         ti->ti_Tag = TAG_SKIP;
  672.         Message( "No 24-Bits Colors data found !" , "Continue" );
  673.         }
  674.     }
  675.     if ( ti = FindTagItem( SA_Colors , ScreenTags ) )
  676.     {
  677.         if ( buf = FindProp( iff , ID_SCRN , ID_CLR2 ) )
  678.         {
  679.         ti->ti_Data = malloc( buf->sp_Size );
  680.         memcpy( (void *)ti->ti_Data , buf->sp_Data , buf->sp_Size );
  681.         }
  682.         else
  683.         {
  684.         ti->ti_Tag = TAG_SKIP;
  685.         Message( "No 12-Bits Colors data found !" , "Continue" );
  686.         }
  687.     }
  688.     if ( ti = FindTagItem( SA_Font , ScreenTags ) )
  689.     {
  690.         if ( buf = FindProp( iff , ID_SCRN , ID_FONT ) )
  691.         {
  692.         fontname = (char *)buf->sp_Data;
  693.         ti->ti_Data = malloc( buf->sp_Size - strlen(fontname)-1 );
  694.         memcpy( (void *)ti->ti_Data , &( (fontname)[strlen(fontname)+1] ) , buf->sp_Size-strlen(fontname)-1 );
  695.         ((struct TextAttr *)ti->ti_Data)->ta_Name = strdup( fontname );
  696.         }
  697.         else
  698.         {
  699.         ti->ti_Tag = TAG_SKIP;
  700.         Message( "No Screen Font data found !" , "Continue" );
  701.         }
  702.     }
  703.     }
  704. }
  705.  
  706. void SaveScreenTags( struct IFFHandle *iff ) {
  707.   struct TagItem *ti;
  708.   long data;
  709.   BOOL PutTags;
  710.  
  711.     PushChunk( iff , ID_SCRN , ID_FORM , IFFSIZE_UNKNOWN );
  712.     if ( ti = FindTagItem( SA_PubName , ScreenTags ) )
  713.     if ( stricmp( (void *)( data = ti->ti_Data ) , "DICE_Project_Handler" ) != 0 )
  714.     {
  715.         PutTags = TRUE;
  716.         PushChunk( iff , ID_SCRN , ID_PUBN , strlen( (char *)data ) + 1 );
  717.         WriteChunkBytes( iff , (void *)data , strlen( (char *)data ) + 1 );
  718.         PopChunk( iff );
  719.     }
  720.     if ( ti = FindTagItem( SA_Pens , ScreenTags ) )
  721.     if ( *((UWORD *)(data = ti->ti_Data)) != ~0 )
  722.     {
  723.         PutTags = TRUE;
  724.         PushChunk( iff , ID_SCRN , ID_PENS , 26 );
  725.         WriteChunkBytes( iff , (void *)data , 26 );
  726.         PopChunk( iff );
  727.     }
  728.     if ( ti = FindTagItem( SA_Colors , ScreenTags ) )
  729.     if ( data = ti->ti_Data )
  730.     {
  731.         PutTags = TRUE;
  732.         PushChunk( iff , ID_SCRN , ID_CLR2 , 40 );
  733.         WriteChunkBytes( iff , (void *)data , 40 );
  734.         PopChunk( iff );
  735.     }
  736.     if ( ti = FindTagItem( SA_Colors32 , ScreenTags ) )
  737.     if ( data = ti->ti_Data )
  738.     {
  739.         PutTags = TRUE;
  740.         PushChunk( iff , ID_SCRN , ID_CLR4 , 56 );
  741.         WriteChunkBytes( iff , (void *)data , 56 );
  742.         PopChunk( iff );
  743.     }
  744.     if ( ti = FindTagItem( SA_Font , ScreenTags ) )
  745.     if ( data = ti->ti_Data )
  746.     {
  747.         PutTags = TRUE;
  748.         PushChunk( iff , ID_SCRN , ID_FONT , IFFSIZE_UNKNOWN );
  749.         WriteChunkBytes( iff , ((struct TextAttr *)data)->ta_Name , strlen( ((struct TextAttr *)data)->ta_Name ) + 1 );
  750.         WriteChunkBytes( iff , (void *)data , sizeof(struct TextAttr) );
  751.         PopChunk( iff );
  752.     }
  753.     if ( PutTags ) {
  754.     PushChunk( iff , ID_SCRN , ID_TAGS , sizeof( struct TagItem )*NUM_SCREEN_TAG );
  755.     WriteChunkBytes( iff , ScreenTags , sizeof(struct TagItem)*NUM_SCREEN_TAG );
  756.     PopChunk( iff );
  757.     }
  758.     PopChunk( iff );
  759. }
  760.  
  761. extern void AttachList(void);
  762. extern void DettachList(void);
  763. extern void CloseEverything( void );
  764.  
  765. extern BOOL named;
  766.  
  767. void CloseScreenPrefs( BOOL use ) {
  768.   char *t;
  769.  
  770.     RemWinC( PalettePrefsWnd );
  771.     RemWinC( ScreenPrefsWnd );
  772.     ClosePalettePrefsWindow( );
  773.     CloseScreenPrefsWindow( );
  774.     if ( use ) {
  775.     DeleteScreenTags( );
  776.     BuildScreenTags( );
  777.     DettachList( );
  778.     CloseEverything( );
  779.     CloseDownScreen( );
  780.     if ( named )
  781.         saved = FALSE;
  782.     SetupScreen( );
  783.     OpenProjectWindow( );
  784.     AttachList( );
  785.     AddWinC( ProjectWnd , HandleProjectIDCMP );
  786.     t = strdup( ProjectPathName );
  787.     ChangeProjectName( t );
  788.     free( t );
  789.     }
  790.     if ( PublicName ) {
  791.     free( PublicName );
  792.     free( Font0.ta_Name );
  793.     FreeScreenList( &ScreenIDs );
  794.     PublicName = NULL;
  795.     }
  796. }
  797.  
  798. int Cancel0Clicked( void )
  799. {
  800.     CloseScreenPrefs( FALSE );
  801. }
  802.  
  803. void Use1Clicked( void ) {
  804.     RemWinC( PalettePrefsWnd );
  805.     ClosePalettePrefsWindow( );
  806. }
  807.  
  808. int UseClicked( void )
  809. {
  810.     Use1Clicked();
  811.     CloseScreenPrefs( TRUE );
  812. }
  813.  
  814. void SetThisColor( ULONG num ) {
  815.     if ( ROMVersion >= 39 )
  816.     SetRGB32( &IntuitionBase->ActiveScreen->ViewPort , num , Colors0[num][0]<<24 , Colors0[num][1]<<24 , Colors0[num][2]<<24 );
  817.     else
  818.     SetRGB4( &IntuitionBase->ActiveScreen->ViewPort , num , Colors0[num][0]>>4 , Colors0[num][1]>>4 , Colors0[num][2]>>4 );
  819. }
  820.  
  821. void SetBackColor( void ) {
  822.   ULONG i;
  823.  
  824.     for(i=0;i<4;i++)
  825.     SetThisColor( i );
  826. }
  827.  
  828. void Cancel1Clicked( void ) {
  829.     memcpy( Pens0 , OldPens0 , 24 );
  830.     memcpy( Colors0 , OldColors0 , 48 );
  831.     SetBackColor( );
  832.     Use1Clicked( );
  833. }
  834.  
  835. void BuildDefScreen( struct TagItem * );
  836. void WindowCorrespond( void );
  837.  
  838. int WorkbenchClicked( void )
  839. {
  840.     Use1Clicked( );
  841.     free( Font0.ta_Name );
  842.     free( PublicName );
  843.     BuildDefScreen( NULL );
  844.     SetBackColor( );
  845.     WindowCorrespond( );
  846. }
  847.  
  848. void AffectColors( int num ) {
  849.     GT_SetGadgetAttrs( PalettePrefsGadgets[3] , PalettePrefsWnd , NULL , GTSL_Level , (long)Colors0[num][0] , TAG_DONE );
  850.     GT_SetGadgetAttrs( PalettePrefsGadgets[4] , PalettePrefsWnd , NULL , GTSL_Level , (long)Colors0[num][1] , TAG_DONE );
  851.     GT_SetGadgetAttrs( PalettePrefsGadgets[5] , PalettePrefsWnd , NULL , GTSL_Level , (long)Colors0[num][2] , TAG_DONE );
  852. }
  853.  
  854. int Palette0Clicked( void )
  855. {
  856.     if ( !PalettePrefsWnd ) {
  857.     if ( !OpenPalettePrefsWindow( ) ) {
  858.         AddWinC( PalettePrefsWnd , HandlePalettePrefsIDCMP );
  859.         GT_SetGadgetAttrs( PalettePrefsGadgets[1] , PalettePrefsWnd , NULL , GTPA_Color , Pens0[0] , TAG_DONE );
  860.         GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
  861.         AffectColors( 0 );
  862.         memcpy( OldPens0 , Pens0 , 24 );
  863.         memcpy( OldColors0 , Colors0 , 48 );
  864.         CurrentColor = CurrentPen = 0;
  865.         DefaultColors = FALSE;
  866.     }
  867.     } else
  868.     ActivateWindow( PalettePrefsWnd );
  869. }
  870.  
  871. int PubNameClicked( void )
  872. {
  873.     free( PublicName );
  874.     PublicName = strdup( GetString( ScreenPrefsGadgets[5] ) );
  875. }
  876.  
  877. int TypeClicked( void )
  878. {
  879.     ScreenType = ScreenPrefsMsg.Code;
  880.     ActiveWB( ScreenType );
  881.     if ( ScreenType == FALSE )
  882.     ActivateGadget( ScreenPrefsGadgets[5] , ScreenPrefsWnd , NULL );
  883. }
  884.  
  885. int ScrWidth0Clicked( void )
  886. {
  887.     Width = Res.x + ScreenPrefsMsg.Code;
  888.     GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GTIN_Number , Width , TAG_DONE );
  889. }
  890.  
  891. int WidthClicked( void )
  892. {
  893.     Width = GetNumber( ScreenPrefsGadgets[8] );
  894.     if ( Width < Res.x )
  895.     Width = Res.x;
  896.     GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GTSC_Top , Width - Res.x , TAG_DONE );
  897. }
  898.  
  899. int ScrHeight0Clicked( void )
  900. {
  901.     Height = Res.y + ScreenPrefsMsg.Code;
  902.     GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GTIN_Number , Height , TAG_DONE );
  903. }
  904.  
  905. int HeightClicked( void )
  906. {
  907.     Height = GetNumber( ScreenPrefsGadgets[10] );
  908.     if ( Height < Res.y )
  909.     Height = Res.y;
  910.     GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GTSC_Top , Height - Res.y , TAG_DONE );
  911. }
  912.  
  913. int OverscanClicked( void )
  914. {
  915.     Overscan = ScreenPrefsMsg.Code;
  916.     UpdateDimension();
  917. }
  918.  
  919. void ColorsInit( void );
  920.  
  921. int DefPaletteClicked( void )
  922. {
  923.     GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
  924.     DefaultColors = TRUE;
  925.     Use1Clicked( );
  926.     ColorsInit( );
  927.     SetBackColor( );
  928. }
  929.  
  930. int AutoscrollClicked( void )
  931. {
  932.     AutoScroll = 1 - AutoScroll;
  933.     GT_SetGadgetAttrs( ScreenPrefsGadgets[13] , ScreenPrefsWnd , NULL , GTCB_Checked , AutoScroll , TAG_DONE );
  934. }
  935.  
  936. int FontClicked( void )
  937. {
  938.   struct FontRequester *fr;
  939.  
  940.     GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
  941.     DefaultFont = FALSE;
  942.     SleepWinC( );
  943.     if ( fr = AskFonts( StrMessages[MSG_MESSAGE_ASK_FONT] , &Font0 ) ) {
  944.     free( Font0.ta_Name );
  945.     Font0.ta_Name = strdup( fr->fo_Attr.ta_Name );
  946.     Font0.ta_YSize = fr->fo_Attr.ta_YSize;
  947.     Font0.ta_Flags = fr->fo_Attr.ta_Flags;
  948.     Font0.ta_Style = fr->fo_Attr.ta_Style;
  949.     FreeAslRequest( fr );
  950.     }
  951.     AwakeWinC( );
  952. }
  953.  
  954. int SysFontsClicked( void )
  955. {
  956.     GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
  957.     DefaultFont = TRUE;
  958. }
  959.  
  960. int PensClicked( void )
  961. {
  962.     CurrentPen = PalettePrefsMsg.Code;
  963.     GT_SetGadgetAttrs( PalettePrefsGadgets[1] , PalettePrefsWnd , NULL , GTPA_Color , Pens0[CurrentPen] , TAG_DONE );
  964. }
  965.  
  966. int PenColorsClicked( void )
  967. {
  968.     Pens0[CurrentPen] = PalettePrefsMsg.Code;
  969. }
  970.  
  971. int TableClicked( void )
  972. {
  973.     CurrentColor = (long)PalettePrefsMsg.Code;
  974.     AffectColors( (int)(CurrentColor) );
  975. }
  976.  
  977. int Red0Clicked( void )
  978. {
  979.     Colors0[CurrentColor][0] = PalettePrefsMsg.Code;
  980.     SetThisColor( CurrentColor );
  981. }
  982.  
  983. int Green0Clicked( void )
  984. {
  985.     Colors0[CurrentColor][1] = PalettePrefsMsg.Code;
  986.     SetThisColor( CurrentColor );
  987. }
  988.  
  989. int Blue0Clicked( void )
  990. {
  991.     Colors0[CurrentColor][2] = PalettePrefsMsg.Code;
  992.     SetThisColor( CurrentColor );
  993. }
  994.  
  995. int ScreenPrefsVanillaKey()
  996. {
  997.     switch( ScreenPrefsMsg.Code ) {
  998.       case 'i':
  999.       case 'I':
  1000.     if ( isupper( (int)ScreenPrefsMsg.Code ) )
  1001.         DisplayIDNum++;
  1002.     else
  1003.         DisplayIDNum--;
  1004.     ScreenPrefsMsg.Code = DisplayIDNum;
  1005.     DispIDClicked( );
  1006.     GT_SetGadgetAttrs( ScreenPrefsGadgets[0] , ScreenPrefsWnd , NULL , GTLV_Selected , DisplayIDNum , GTLV_Top , DisplayIDNum , TAG_DONE );
  1007.     break;
  1008.       case 'u':
  1009.       case 'U':
  1010.     UseClicked();
  1011.     break;
  1012.       case 'a':
  1013.       case 'A':
  1014.     Cancel0Clicked();
  1015.     break;
  1016.       case 'c':
  1017.       case 'C':
  1018.     AutoscrollClicked( );
  1019.     break;
  1020.       case 'p':
  1021.       case 'P':
  1022.     Palette0Clicked();
  1023.     break;
  1024.       case 't':
  1025.       case 'T':
  1026.     ScreenPrefsMsg.Code = 1 - ScreenType;
  1027.     TypeClicked();
  1028.     GT_SetGadgetAttrs( ScreenPrefsGadgets[6] , ScreenPrefsWnd , NULL , GTCY_Active , ScreenType , TAG_DONE );
  1029.       break;
  1030.       case 'w':
  1031.       case 'W':
  1032.     ActivateGadget( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL );
  1033.     break;
  1034.       case 'h':
  1035.       case 'H':
  1036.     ActivateGadget( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL );
  1037.     break;
  1038.       case 'o':
  1039.       case 'O':
  1040.     if ( isupper( ScreenPrefsMsg.Code ) )
  1041.     {
  1042.         if ( Overscan > 0 )
  1043.         Overscan --;
  1044.     }
  1045.     else
  1046.     {
  1047.         if ( Overscan < 3 )
  1048.         Overscan ++;
  1049.     }
  1050.     GT_SetGadgetAttrs( ScreenPrefsGadgets[11] , ScreenPrefsWnd , NULL , GTCY_Active , Overscan , TAG_DONE );
  1051.     UpdateDimension( );
  1052.     break;
  1053.       case 'd':
  1054.       case 'D':
  1055.     DefPaletteClicked();
  1056.     break;
  1057.       case 'f':
  1058.       case 'F':
  1059.     FontClicked();
  1060.     break;
  1061.       case 'y':
  1062.       case 'Y':
  1063.     SysFontsClicked();
  1064.     break;
  1065.       case 'r':
  1066.       case 'R':
  1067.     WorkbenchClicked( );
  1068.     break;
  1069.     }
  1070. }
  1071.  
  1072. int PalettePrefsVanillaKey()
  1073. {
  1074.     switch( PalettePrefsMsg.Code ) {
  1075.       case 'p':
  1076.       case 'P':
  1077.     if ( isupper( PalettePrefsMsg.Code ) )
  1078.     {
  1079.         if ( CurrentPen > 0 )
  1080.         CurrentPen--;
  1081.     }
  1082.     else
  1083.     {
  1084.         if ( CurrentPen < 12 )
  1085.         CurrentPen++;
  1086.     }
  1087.     GT_SetGadgetAttrs( PalettePrefsGadgets[0] , PalettePrefsWnd , NULL , GTLV_Selected , CurrentPen , GTLV_Top , CurrentPen , TAG_DONE );
  1088.     PalettePrefsMsg.Code = CurrentPen;
  1089.     PensClicked( );
  1090.     break;
  1091.       case 't':
  1092.       case 'T':
  1093.     if ( isupper( PalettePrefsMsg.Code ) )
  1094.     {
  1095.         if ( CurrentColor > 0 )
  1096.         CurrentColor--;
  1097.     }
  1098.     else
  1099.     {
  1100.         if ( CurrentColor < 3 )
  1101.         CurrentColor++;
  1102.     }
  1103.     GT_SetGadgetAttrs( PalettePrefsGadgets[2] , PalettePrefsWnd , NULL , GTPA_Color , CurrentColor , TAG_DONE );
  1104.     AffectColors( CurrentColor );
  1105.     break;
  1106.       case 'r':
  1107.       case 'R':
  1108.     if ( isupper( PalettePrefsMsg.Code ) )
  1109.     {
  1110.         if ( Colors0[ CurrentColor ][0] > 0 )
  1111.         Colors0[CurrentColor][0]--;
  1112.     }
  1113.     else
  1114.     {
  1115.         if ( Colors0[CurrentColor][0] < 255 )
  1116.         Colors0[CurrentColor][0]++;
  1117.     }
  1118.     GT_SetGadgetAttrs( PalettePrefsGadgets[3] , PalettePrefsWnd , NULL , GTSL_Level , Colors0[CurrentColor][0] , TAG_DONE );
  1119.     SetThisColor( CurrentColor );
  1120.     break;
  1121.       case 'g':
  1122.       case 'G':
  1123.     if ( isupper( PalettePrefsMsg.Code ) )
  1124.     {
  1125.         if ( Colors0[ CurrentColor ][1] > 0 )
  1126.         Colors0[CurrentColor][1]--;
  1127.     }
  1128.     else
  1129.     {
  1130.         if ( Colors0[CurrentColor][1] < 255 )
  1131.         Colors0[CurrentColor][1]++;
  1132.     }
  1133.     GT_SetGadgetAttrs( PalettePrefsGadgets[4] , PalettePrefsWnd , NULL , GTSL_Level , Colors0[CurrentColor][1] , TAG_DONE );
  1134.     SetThisColor( CurrentColor );
  1135.     break;
  1136.       case 'b':
  1137.       case 'B':
  1138.     if ( isupper( PalettePrefsMsg.Code ) )
  1139.     {
  1140.         if ( Colors0[CurrentColor][2] > 0 )
  1141.         Colors0[CurrentColor][2]--;
  1142.     }
  1143.     else
  1144.     {
  1145.         if ( Colors0[CurrentColor][2] < 255 )
  1146.         Colors0[CurrentColor][2]++;
  1147.     }
  1148.     GT_SetGadgetAttrs( PalettePrefsGadgets[5] , PalettePrefsWnd , NULL , GTSL_Level , Colors0[CurrentColor][2] , TAG_DONE );
  1149.     SetThisColor( CurrentColor );
  1150.     break;
  1151.       case 'u':
  1152.       case 'U':
  1153.     Use1Clicked();
  1154.     break;
  1155.       case 'A':
  1156.       case 'a':
  1157.     Cancel1Clicked();
  1158.     break;
  1159.     }
  1160. }
  1161.  
  1162. #define winsignal(win) (1 << win->UserPort->mp_SigBit)
  1163.  
  1164. void ColorsInit( void ) {
  1165.   struct Screen *WBScr;
  1166.   long i,val;
  1167.  
  1168.     WBScr = LockPubScreen( "Workbench" );
  1169.     if ( ROMVersion >= 39 ) {
  1170.     GetRGB32( WBScr->ViewPort.ColorMap , 0L , 4L , (ULONG *)Colors0 );
  1171.     for(i=0;i<4;i++)
  1172.     {
  1173.         Colors0[i][0] >>= 24;
  1174.         Colors0[i][1] >>= 24;
  1175.         Colors0[i][2] >>= 24;
  1176.     }
  1177.     }
  1178.     else
  1179.     {
  1180.     for(i=0;i<4;i++)
  1181.     {
  1182.         val = GetRGB4( WBScr->ViewPort.ColorMap , i );
  1183.         Colors0[i][0] = ( (val&0x0F00)>>4 ) + ( (val&0x0F00)>>8 );
  1184.         Colors0[i][1] = val&0x00F0 + ( (val&0x00F0)>>4 );
  1185.         Colors0[i][2] = ( (val&0x0F)<<4 ) + val&0x0F;
  1186.     }
  1187.     }
  1188.     UnlockPubScreen( "Workbench" , WBScr );
  1189. }
  1190.  
  1191. void Tag4TOColors( struct ColorSpec *cs ) {
  1192.     while( cs->ColorIndex != -1 ) {
  1193.     if ( cs->ColorIndex >= 0 && cs->ColorIndex < 4 ) {
  1194.         Colors0[cs->ColorIndex][0] = (cs->Red<<4)+cs->Red;
  1195.         Colors0[cs->ColorIndex][1] = (cs->Green<<4)+cs->Red;
  1196.         Colors0[cs->ColorIndex][2] = (cs->Blue<<4)+cs->Red;
  1197.     }
  1198.     DefaultColors = FALSE;
  1199.     cs++;
  1200.     }
  1201. }
  1202.  
  1203. void Tag32TOColors( ULONG *data ) {
  1204.   ULONG num = *data++ , index = *data++;
  1205.  
  1206.     while ( index < 4 && num-- ) {
  1207.     Colors0[index][0] = *data++>>24;
  1208.     Colors0[index][1] = *data++>>24;
  1209.     Colors0[index++][2] = *data++>>24;
  1210.     DefaultColors = FALSE;
  1211.     }
  1212. }
  1213.  
  1214. void PensInit( void ) {
  1215.   struct Screen *WBScr;
  1216.   struct DrawInfo *DI;
  1217.   int num;
  1218.  
  1219.     WBScr = LockPubScreen( "Workbench" );
  1220.     DI = GetScreenDrawInfo( WBScr );
  1221.     num = DI->dri_NumPens;
  1222.     if ( num>12 )
  1223.     num = 12;
  1224.     memcpy( Pens0 , DI->dri_Pens , num<<1 );
  1225.     FreeScreenDrawInfo( WBScr , DI );
  1226.     UnlockPubScreen( "Workbench" , WBScr );
  1227. }
  1228.  
  1229. void PensConvert( UWORD *pen ) {
  1230.   int num=0;
  1231.  
  1232.     if ( *pen != ~0 )
  1233.     DefaultColors = FALSE;
  1234.     while( *pen != ~0 && num<12 )
  1235.     Pens0[num++] = *pen++;
  1236. }
  1237.  
  1238. void BuildDefScreen( struct TagItem *intags )
  1239. {
  1240.   long data;
  1241.   struct TagItem *ti;
  1242.  
  1243.     DisplayID = HIRES_KEY;
  1244.     if ( ti = FindTagItem( SA_DisplayID , intags ) )
  1245.     if ( data = ti->ti_Data )
  1246.         DisplayID = (long)data;
  1247.     DisplayIDNum = BuildScreenList( &ScreenIDs , DisplayID );
  1248.     PublicName = strdup( "DICE_Project_Handler" );
  1249.     if ( ti = FindTagItem( SA_PubName , intags ) )
  1250.     if ( data = ti->ti_Data ) {
  1251.         free( PublicName );
  1252.         PublicName = strdup( (char *)data );
  1253.     }
  1254.     Overscan = 0;
  1255.     if ( ti = FindTagItem( SA_Overscan , intags ) )
  1256.     switch( ti->ti_Data ) {
  1257.       case OSCAN_STANDARD:
  1258.         Overscan = 4;
  1259.         break;
  1260.       case OSCAN_TEXT:
  1261.         Overscan = 3;
  1262.         break;
  1263.       case OSCAN_MAX:
  1264.         Overscan = 1;
  1265.         break;
  1266.       case OSCAN_VIDEO:
  1267.         Overscan = 2;
  1268.         break;
  1269.     }
  1270.     ScreenType = 0;
  1271.     if ( ti = FindTagItem( SA_Type , intags ) )
  1272.     if ( ti->ti_Data == WBENCHSCREEN )
  1273.         ScreenType = 1;
  1274.     AutoScroll = TRUE;
  1275.     if ( ti = FindTagItem( SA_AutoScroll , intags ) )
  1276.     AutoScroll = (UBYTE)ti->ti_Data;
  1277.     Height = 200;
  1278.     Width = 724;
  1279.     Res.x = 724;
  1280.     Res.y = 200;
  1281.     UpdateDimension();
  1282.     if ( ti = FindTagItem( SA_Height , intags ) )
  1283.     if ( ti->ti_Data!=STDSCREENHEIGHT ) {
  1284.         Height = ti->ti_Data;
  1285.     }
  1286.     if ( ti = FindTagItem( SA_Width , intags ) )
  1287.     if ( ti->ti_Data!=STDSCREENWIDTH ) {
  1288.         Width = ti->ti_Data;
  1289.     }
  1290.     DefaultColors = TRUE;
  1291.     ColorsInit();
  1292.     if ( ti = FindTagItem( SA_Colors32 , intags ) )
  1293.     {
  1294.     if ( data = ti->ti_Data )
  1295.         Tag32TOColors( (ULONG *)data );
  1296.     }
  1297.     else if ( ti = FindTagItem( SA_Colors , intags ) )
  1298.         if ( data = ti->ti_Data )
  1299.         Tag4TOColors( (struct ColorSpec *)data );
  1300.     PensInit( );
  1301.     if ( ti = FindTagItem( SA_Pens , intags ) )
  1302.     if ( data = ti->ti_Data )
  1303.         PensConvert( (UWORD *)data );
  1304.     Font0.ta_Name = strdup( "times.font" );
  1305.     Font0.ta_YSize = 13;
  1306.     Font0.ta_Style = 0;
  1307.     DefaultFont = TRUE;
  1308.     if ( ti = FindTagItem( SA_Font , intags ) )
  1309.     if ( data = ti->ti_Data ) {
  1310.         DefaultFont = FALSE;
  1311.         free( Font0.ta_Name );
  1312.         memcpy( (void *)&Font0 , (void *)data , sizeof(struct TextAttr) );
  1313.         Font0.ta_Name = strdup( ((struct TextAttr *)data)->ta_Name );
  1314.     }
  1315. }
  1316.  
  1317. void WindowCorrespond( void ) {
  1318.     GT_SetGadgetAttrs( ScreenPrefsGadgets[0] , ScreenPrefsWnd , NULL , GTLV_Selected , DisplayIDNum , GTLV_Labels , &ScreenIDs , TAG_DONE );
  1319.     GT_SetGadgetAttrs( ScreenPrefsGadgets[5] , ScreenPrefsWnd , NULL , GTST_String , PublicName , TAG_DONE );
  1320.     GT_SetGadgetAttrs( ScreenPrefsGadgets[7] , ScreenPrefsWnd , NULL , GTSC_Top , Width-Res.x , GTSC_Total , 16384-Res.x , GTSC_Visible , 100 , TAG_DONE );
  1321.     GT_SetGadgetAttrs( ScreenPrefsGadgets[8] , ScreenPrefsWnd , NULL , GTIN_Number , Width , TAG_DONE );
  1322.     GT_SetGadgetAttrs( ScreenPrefsGadgets[9] , ScreenPrefsWnd , NULL , GTSC_Top , Height-Res.y , GTSC_Total , 16384-Res.y , GTSC_Visible , 100 , TAG_DONE );
  1323.     GT_SetGadgetAttrs( ScreenPrefsGadgets[10] , ScreenPrefsWnd , NULL , GTIN_Number , Height , TAG_DONE );
  1324.     GT_SetGadgetAttrs( ScreenPrefsGadgets[11] , ScreenPrefsWnd , NULL , GTCY_Active , Overscan , TAG_DONE );
  1325.     GT_SetGadgetAttrs( ScreenPrefsGadgets[13] , ScreenPrefsWnd , NULL , GTCB_Checked , AutoScroll , TAG_DONE );
  1326.     if ( !DefaultColors )
  1327.     GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
  1328.     else
  1329.     GT_SetGadgetAttrs( ScreenPrefsGadgets[12] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
  1330.     if ( !DefaultFont )
  1331.     GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , FALSE , TAG_DONE );
  1332.     else
  1333.     GT_SetGadgetAttrs( ScreenPrefsGadgets[15] , ScreenPrefsWnd , NULL , GTCB_Checked , TRUE , TAG_DONE );
  1334.     if ( ScreenType )
  1335.     {
  1336.     GT_SetGadgetAttrs( ScreenPrefsGadgets[6] , ScreenPrefsWnd , NULL , GTCY_Active , ScreenType , TAG_DONE );
  1337.     ActiveWB( TRUE );
  1338.     }
  1339. }
  1340.  
  1341.  
  1342. struct TagItem *ScreenPrefs( struct TagItem *intags ) {
  1343.     if ( !ScreenPrefsWnd ) {
  1344.     BuildDefScreen( intags );
  1345.     if ( !OpenScreenPrefsWindow( ) ) {
  1346.         WindowCorrespond( );
  1347.         AddWinC( ScreenPrefsWnd , HandleScreenPrefsIDCMP );
  1348.     }
  1349.     } else {
  1350.     WindowToFront( ScreenPrefsWnd );
  1351.     ActivateWindow( ScreenPrefsWnd );
  1352.     }
  1353. }
  1354.  
  1355.